package mtt.us.hmvcFramework.client.hmvc.controller;

import mtt.us.hmvcFramework.client.hmvc.events.CloseViewEvent;
import mtt.us.hmvcFramework.client.hmvc.events.DisposeEvent;
import mtt.us.hmvcFramework.client.hmvc.events.RemoveViewEvent;
import hmvc4gwt.client.controller.Controller;
import hmvc4gwt.client.event.HmvcEvent;
import hmvc4gwt.client.event.HmvcEventListener;

public abstract class GuiController extends Controller implements
		HmvcEventListener {
	
	/**
	 * registriert den Controller für das Emfangen von Framework-Events
	 */
	public final void doInit() {
		
		register(DisposeEvent.class, this);
		
		register(CloseViewEvent.class, this);
		
		doInitImpl();
	}

	/**
	 * repräsentiert die Initializeable-Methode doInit()
	 */
	protected abstract void doInitImpl();
	
	/**
	 * Implementiert die HmvcEventListener.handleEvent() Methode und filtert
	 * "Framework-Events", ruft am Ende handelGuiEvent() auf
	 */
	public final void handleEvent(HmvcEvent event) {
		
		if (event instanceof DisposeEvent) {
			
			
			/*
			 * View aus dem RootPanel entfernen
			 */
			fireEvent(new RemoveViewEvent(getView()), true, false, false);
			
			/*
			 * Triade entfernen
			 */
			getTriad().dispose();
			
			return;
			
		} else if (event instanceof CloseViewEvent) {
			
			if (getView() != null) {
				/*
				 * View aus dem RootPanel entfernen, nur wenn sie Angezeigt wird
				 */
				
				if (getView().isVisible()) {
					fireEvent(new RemoveViewEvent(getView()), true, false, false);
				}
			}
			
			return;
		}

		/*
		 * Event weiter leiten
		 */
		handleEventImpl(event);
	}

	/**
	 * Repräsentiert die Interfacte-Methode HmvcEventListener.handleEvent(). Sie
	 * wird vom Framework nach dem Auruf von handleEvent() aufgerufen
	 * 
	 * @param event
	 */
	public abstract void handleEventImpl(HmvcEvent event);
}
